package Array.Simulation;
/**
 * 描述
 * 有一个NxN整数矩阵，请编写一个算法，将矩阵顺时针旋转90度。
 *
 * 给定一个NxN的矩阵，和矩阵的阶数N,请返回旋转后的NxN矩阵。
 *
 * 数据范围：0<n<300，矩阵中的值满足 0 ≤val≤1000
 *
 * 要求：空间复杂度 O(N^2)，时间复杂度 O(N^2)
 * 进阶：空间复杂度 O(1)，时间复杂度 O(N^2)
 *
 * */
class BM99 {

    //暴力法
    public int[][] rotateMatrix1(int[][] mat, int n) {
        // write code here
        int[][] temp = new int[n][n];//新建temp对象，作为最终返回的对象
        for(int i = 0;i < n;i++){
            for(int j = 0;j < n;j++){
                temp[j][n-1-i] = mat[i][j];//直接交换
            }
        }
        return temp;
    }


    public int[][] rotateMatrix(int[][] mat, int n) {
        // write code here
        //顺时针旋转90度,按照对角线进行翻转，然后反转每一行的元素
        for(int i=0;i<n;i++){
            for(int j=0;j<i;j++){
                swap(mat,i,j);
            }
        }
        for(int i=0;i<n;i++){
            reverse(mat[i],0,n-1);
        }
        return mat;
    }


    //反转数组
    private void reverse(int[] matrix, int s, int e){
        while(s<e){
            int temp = matrix[s];
            matrix[s] = matrix[e];
            matrix[e] = temp;
            s++;
            e--;
        }
    }

    private void swap(int[][] matrix, int i, int j){
        int temp = matrix[i][j];
        matrix[i][j] = matrix[j][i];
        matrix[j][i] = temp;
    }
}
